package com.javasm.task.async;

import com.javasm.util.AliyunSmsUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import org.springframework.stereotype.Component;

import javax.annotation.Resource;

//异步任务 AsynTask
@Component
@Slf4j
public class AsynTaskManager {// spring封装线程池 线程执行统一管理

    // 1.线程  new Runnable()无法控制线程的数量，每次调用会创建一个线程，容易造成线程过多，cup占用过多
//    Thread thread = new Thread(new Runnable() {
//        @Override
//        public void run() {
//            // 异步执行的代码
//        }
//    });
//    thread.start();

    //2. 线程池  线程池的特性： 预创建指定数量的核心线程数100，可以设置队列长度200，可以设置线程拒绝的线程处理方案

    //3. spring封装线程池 ThreadPoolTaskExecutor
    private static ThreadPoolTaskExecutor threadPoolTaskExecutor ;//静态容器对象 ： 1.通过getBean获取  2.通过Spring容器，set和get方法获取； 静态变量赋值后，全局可用

    @Resource
    public  void setThreadPoolTaskExecutor(ThreadPoolTaskExecutor taskPool) { // spring初始化通过set方法注入，获取threadPoolTaskExecutor
        threadPoolTaskExecutor = taskPool;
    }


    //执行线程的异步任务
    public static void execute(Runnable runnable){// 项目启动完成后，通过容器获取静态变量 threadPoolTaskExecutor
          // 方法2 通过beanUtil获取静态变量
//        if(threadPoolTaskExecutor== null){
//            //获取静态对象 注入容器中
//            threadPoolTaskExecutor=  BeanUtil.getBean(ThreadPoolTaskExecutor.class);
//        }

        threadPoolTaskExecutor.execute(runnable);
    }


    public static Runnable runnableTask(String loginPhone,String code){//创建Runnable线程
        Runnable r = new Runnable() {
            @Override
            public void run() {
                //发送休眠几秒
                try {
                    Thread.sleep(3000);
                    // 阿里云短信发送
                    AliyunSmsUtil.sendValicode(loginPhone,code);
                    log.info(Thread.currentThread().getName()+"异步线程任务发送短信:"+loginPhone+"-"+code);//发送短信
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };
        return r;
    }


}
